-------------------------
-- 【同步异步信号】
--
-- 信号与时钟信号之间两种不同的关系。所谓同步是指信号有效状态的采集必须与时钟的有效沿（上
-- 升沿或下降沿）同步，而异步信号则与时钟信号无关，只要异步信号有效，就会发挥其作用。
--
-- 我们以复位信号为例，介绍同步和异步信号的设计。复位信号在电子电路的设计中异常重要，通常通过复位，使
-- 电路处于一个确定的初始状态，也可以通过手动或自动的方式，使电路出现运行异常（如程序跑飞等情况）时，使电路回到初始状态。
-------------------------


-- 同步复位信号(先判断时钟信号)
process(clk, reset) begin
    if clk'event and clk = '1' then
        if reset = '1' then
            q <= 0;
        else
            q <= d;
        end if;
    end if;
end process;


-- 异步复位信号（先判断复位信号）
process(clk, reset) begin
    if reset = '1' then
        q <= 0;
    else
        q <= d;
    end if;
end process;


--
-- 设计一个4位宽的触发器，具有异步清零clr和异步置位prn和同步使能控制功能
--

entity diff4 is 
    port(
        clk, clr, prn, en : in std_logic；
        d : in std_logic_vector(3 downto 0);
        q : out std_logic_vector(3 downto 0);
    );
end entity；

architecture a of diff4 is begin
    process(clr, prn, clk, en) begin
        if clr = '1' then       -- 异步清0
            q <= (others => 0);
        elsif prn = '1' then    -- 异步置位
            q <= (others => 1);
        elsif rising_edge(clk) then
            if en = '1' then    -- 同步使能
                q <= d;
            end if;
        end if;
    end process;
end a;